一個網站系統,最重要的就是系統儲存的資料,我們在本地有開發用的資料庫,PythonAnywhere
上面有一個SQLite的資料庫,隨著我們新增愈多的商家,就愈需要做好資料的備份。
今天我們會說明資料備份移轉的方式,並且使用Django的一些套件,來管理我們的系統。
匯出資料
python manage.py dumpdata --natural-foreign --natural-primary \
-e contenttypes -e auth -e admin -e sessions \
--indent 2 -o ./db/latest_db.json
--natural-foreign
--natural-primary
這兩個參數跟資料的 PK(primary key)
FK(foreign key)
有關。PK
是資料在資料庫中獨一無二的編號,可能是整數或是UUID
,就是流水號的概念。
在A資料表中,使用B資料表的PK
,就稱作FK
Tag_Management
這個表中有兩個FK
分別是Tag
和 Place
,表示某一間店有某一個標籤。# food/models.py
class Tag_Management(models.Model):
**place** = models.**ForeignKey**(**Place**, on_delete=models.SET_NULL, null=True)
**tags** = models.**ForeignKey**(**Tag**, on_delete=models.SET_NULL, null=True)
假設資料庫A匯出的店家有一個pk=1
名叫覺丸拉麵,但是資料庫B已經有一個pk=1
的小鳥不吃肉,這樣直接匯入資料的話,對應就會出錯,因此加上這個參數可以自動處理這個問題。
-e
or --exclude
這是可以去除某些資料,像是session contenttypes,這種資料是暫時的不是很重要去除掉會比較好。auth admin 則是跟使用者資料有關,這是相對敏感的資料,所以在備份時需要注意。匯入資料
匯入資料就相對簡單,直接指定檔案的路徑即可。
python manage.py loaddata ./db/latest_db.json
實際使用方式
筆者會將開發過程新增的照片、新增的店家資料匯出,並且加入git之中,方便我們上傳至PythonAnywhere
。
如果有自己的伺服器,比較好的做法是用 scp
指令將檔案上傳到伺服器中,再匯入資料,一個是減少git的檔案,一個是避免敏感資料外洩。
如果是在PythonAnywhere
匯出資料,可以直接透過網頁下載。
直接在food/admin.py
加入下方程式碼
# food/admin.py
class PlaceAdmin(admin.ModelAdmin):
list_display = ('id', 'name', 'address', 'web_site', 'pub_date')
list_filter = ( 'pub_date','tags')
search_fields = ('name', 'address', 'web_site')
ordering = ('-id',)
ordering
使用-
就表示將遞減排序。編輯Place
時,可以看到Tag
使用 inlines
,可以將Tag
的介面嵌入在下方。
class TagInlineAdmin(admin.StackedInline):
model = Place.tags.through
class PlaceAdmin(admin.ModelAdmin):
list_display = ('id', 'name', 'address', 'web_site', 'pub_date')
list_filter = ('pub_date', 'tags')
search_fields = ('name', 'address', 'web_site')
ordering = ('-id',)
readonly_fields = ('pub_date',)
inlines = [TagInlineAdmin, ]
結果
完成了這個章節,更加感受到Django的方便與強大,這樣一來其實我們不用實作後台介面,就可以增減更新資料。
台南不需要米其林